
/**********************************************************************************\
** 文件名称: MessageOut.c
** 创建人员: YCG
** 创建日期: 2019-02-08
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "MessageOut.h"

#include "usbd_cdc_if.h"
#include "print.h"
#include "fatfs.h"
#include "key.h"
#include "oled.h"
#include "flash.h"
#include "led.h"
#include "heap.h"

extern UART_HandleTypeDef huart1;
extern USBD_HandleTypeDef hUsbDeviceFS;
extern FATFS* TF_FatFs; 

StreamBufferHandle_t MessageOutHand;        //定义输出信息的流缓冲区句柄

/*******************************************************************************
** 函数名称: StartMessageOutTask
** 功能描述: 信息输入输出任务
** 参数说明: argument: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-05-07
********************************************************************************/
void MessageTask(void * argument)
{
    for(;;)
    {
        TimeOut_t xTimeOut;     //用来保存当前时间的变量

        TickType_t xTicksToWait = 10;     //等待时间
	      uint8_t* yBuf = MyMalloc(MessageBuf_OnceSize);           //申请缓存空间	
      
   
        uint16_t  ySize = xStreamBufferReceive(MessageOutHand, yBuf, MessageBuf_OnceSize, portMAX_DELAY);  //等待缓存中由数据

        vTaskSetTimeOutState( &xTimeOut );   //记录当前的时间
        do
        {
            if(HAL_UART_Transmit_DMA(&huart1, yBuf, ySize) == HAL_OK) { //启动DMA发送
                break;
            }
        } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE );  //当超时即终止传输

        if(hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED) {                     //判断当前是否连接上
            do
            {
                if(CDC_Transmit_FS(yBuf, ySize) != USBD_BUSY) {             //通过USB串口发送数据
                    break;
                }
            } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE );  //当超时即终止
        }
				vTaskDelay(5);
				MyFree(yBuf);
    }
}

/*******************************************************************************
** 函数名称: Uprintf
** 功能描述: 格式化输出到缓存
** 参数说明: fmt: [输入/出]
**			 ...: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-05-07
********************************************************************************/
void Uprintf(char *fmt, ...)
{
    va_list arp;
    va_start (arp, fmt);         /* 将可变长参数转换为va_list */
	
	 uint8_t* yBuf = pvPortMalloc(MessageBuf_OnceSize);           //申请缓存空间	
    RTC_GetTime(yBuf);                                            //获取系统时间
	
    uint16_t  ySize = PrintArray(yBuf + RTC_BufSize, fmt, arp);	       //将数据格式化进缓存中
	
    ySize += RTC_BufSize;                                             //定位到时间信息之后          
    uint16_t yNum = 0;
    while(ySize > MessageBuf_OnceSize) {

        xStreamBufferSend(MessageOutHand, &yBuf[yNum], MessageBuf_OnceSize, 1000);   //将数据发送到缓存之中
        yNum += MessageBuf_OnceSize;
        ySize -= MessageBuf_OnceSize;
    }
    if(ySize > 0)
        xStreamBufferSend(MessageOutHand, &yBuf[yNum], ySize, 1000);   //将数据发送到缓存之中

		vPortFree(yBuf);           //释放缓存空间
    va_end (arp);
}

/*******************************************************************************
** 函数名称: MessageOut_Init
** 功能描述: 初始化信息输入输出设备
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-05-07
********************************************************************************/
void MessageOut_Init(void)
{
    MessageOutHand = xStreamBufferCreate(MessageBuf_AllSize, 1);  //初始化缓冲区
}

/********************************End of File************************************/
